package serveur;

import commun.BanqueService;
import commun.Compte;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashMap;


public class Serveur extends UnicastRemoteObject implements BanqueService{
    private final HashMap<String, Compte> comptes = new HashMap<>();
    private final HashMap<String, Boolean> disponibiliteCompte = new HashMap<>();
    
    public Serveur() throws RemoteException {
        super();
    }

    @Override
    public void ouvrirCompte(String id, String password) {
	if(this.comptes.containsKey(id)){
	    System.out.println("Le compte existe déjà : Identifiant : " + id + " et Password : " + password);	
	}else {
	    Compte c1 = new Compte(id, password, 0);
	    comptes.put(id, c1);
            System.out.println("Le compte ayant comme identifiant : " + id + " a été ajouté");
	}
    }

    @Override
    public Compte verifie(String id, String password) {
	Compte compte = null;

            if(this.comptes.containsKey(id)){
                compte = this.comptes.get(id);
		if(!compte.getPassword().equals(password)){
		   compte = null;
		   System.out.println("Le compte associé a l'identifiant : " + id + " a essayé de connecter mais le mot de passe est incorrect");		
		}
            }	

	return compte;
    }

    @Override
    public int fermerCompte(String id, String password) {
	int valueRetour = 0;
	    
	    if(this.verifie(id, password) != null){
	    	Compte cc = this.verifie(id, password);
		valueRetour = cc.getSolde();
	  	this.comptes.remove(id);
		System.out.println("Le compte a été supprimé ayant comme identifiant : " + id);
	    }else{
		System.out.println("Le compte ayant comme identifiant : " + id + " n'existe pas !");
	    }
	
	return valueRetour;
    }

    @Override
    public void deposer(int somme, Compte c) {
	comptes.get(c.getID()).setSolde((comptes.get(c.getID()).getSolde()) + somme);
        System.out.println("La somme de " + somme + " a été ajoutée au compte ayant comme identifiant : " + c.getID() + " et le somme actuel est de " + comptes.get(c.getID()).getSolde() + " €");
    }

    @Override
    public int retirer(int somme, Compte c) {
    	int value = 0;
            comptes.get(c.getID()).setSolde((comptes.get(c.getID()).getSolde()) - somme);
            value = comptes.get(c.getID()).getSolde();
            
            System.out.println("La somme de " + somme + " a été retirée au compte ayant comme identifiant : " + c.getID() + " et le somme actuel est de " + value + " €");
    	return value;	
    }

    @Override
    public int voirSolde(Compte c) {
	int soldeRetour = 0;

	    soldeRetour = comptes.get(c.getID()).getSolde();
            System.out.println("Le solde du compte ayant comme identifiant : " + c.getID() + " est de " + c.getSolde() + " a été demandé");

	return soldeRetour;
    }

    @Override
    public boolean connecter(String id) throws RemoteException {
        boolean bR = false;
	if(this.disponibiliteCompte.containsKey(id)){
	}else {
	    disponibiliteCompte.put(id, false);
            bR = true;
            System.out.println("Le compte ayant comme identifiant : " + id + " s'est connecté à son espace");
	}
        return bR;
    }

    @Override
    public void deconnecter(String id) throws RemoteException {
        this.disponibiliteCompte.remove(id);   
        System.out.println("Le compte ayant comme identifiant : " + id + " s'est déconnecté à son espace");     
    }
    
    public static void main(String[] args) throws RemoteException {
        Serveur srv = new Serveur();
        try {
            Registry reg = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
            reg.bind("ServeurRMI", srv);
        } catch (RemoteException | AlreadyBoundException e) {
            try {
                Registry reg = LocateRegistry.getRegistry();
                reg.rebind("Serveur", srv);
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
    }
}
